-- =====================================================
-- 数据库清空脚本
-- =====================================================
-- 用途：清空所有表数据，重置序列
-- 使用场景：在重新运行种子数据脚本之前执行
-- 警告：⚠️ 此脚本会删除所有数据！仅在开发/测试环境使用
-- 版本：v2.0（包含 file_metadata 表）
-- 更新日期：2025-01-18
-- =====================================================

BEGIN;

-- =====================================================
-- 显示开始信息
-- =====================================================

DO $$
BEGIN
    RAISE NOTICE '==============================================';
    RAISE NOTICE '开始清空数据库...';
    RAISE NOTICE '==============================================';
END $$;

-- =====================================================
-- 清空所有表（按依赖关系倒序）
-- =====================================================

-- 删除审计日志（无依赖）
TRUNCATE TABLE audit_logs RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ audit_logs 已清空'; END $$;

-- 删除会话（依赖 users）
TRUNCATE TABLE sessions RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ sessions 已清空'; END $$;

-- 删除用户权限关联表（依赖 users 和 permissions）
TRUNCATE TABLE user_permissions RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ user_permissions 已清空'; END $$;

-- 删除角色权限关联表（依赖 roles 和 permissions）
TRUNCATE TABLE role_permissions RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ role_permissions 已清空'; END $$;

-- 删除文件元数据（依赖 documents 和 users，必须在 documents 之前删除）
TRUNCATE TABLE file_metadata RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ file_metadata 已清空'; END $$;

-- 删除文档（依赖 doc_categories 和 users）
TRUNCATE TABLE documents RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ documents 已清空'; END $$;

-- 删除用户（依赖 roles）
TRUNCATE TABLE users RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ users 已清空'; END $$;

-- 删除权限（无依赖）
TRUNCATE TABLE permissions RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ permissions 已清空'; END $$;

-- 删除分类（无依赖，但有自引用）
TRUNCATE TABLE doc_categories RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ doc_categories 已清空'; END $$;

-- 删除角色（无依赖）
TRUNCATE TABLE roles RESTART IDENTITY CASCADE;
DO $$ BEGIN RAISE NOTICE '✅ roles 已清空'; END $$;

-- =====================================================
-- 验证清空结果
-- =====================================================

DO $$
DECLARE
    role_count INTEGER;
    user_count INTEGER;
    permission_count INTEGER;
    category_count INTEGER;
    document_count INTEGER;
    file_count INTEGER;
    total_count INTEGER;
BEGIN
    SELECT COUNT(*) INTO role_count FROM roles;
    SELECT COUNT(*) INTO user_count FROM users;
    SELECT COUNT(*) INTO permission_count FROM permissions;
    SELECT COUNT(*) INTO category_count FROM doc_categories;
    SELECT COUNT(*) INTO document_count FROM documents;
    SELECT COUNT(*) INTO file_count FROM file_metadata;
    
    total_count := role_count + user_count + permission_count + category_count + document_count + file_count;
    
    RAISE NOTICE '==============================================';
    RAISE NOTICE '清空结果验证：';
    RAISE NOTICE '----------------------------------------------';
    RAISE NOTICE 'roles:          % 行', role_count;
    RAISE NOTICE 'users:          % 行', user_count;
    RAISE NOTICE 'permissions:    % 行', permission_count;
    RAISE NOTICE 'doc_categories: % 行', category_count;
    RAISE NOTICE 'documents:      % 行', document_count;
    RAISE NOTICE 'file_metadata:  % 行', file_count;
    RAISE NOTICE '----------------------------------------------';
    RAISE NOTICE '总计:           % 行', total_count;
    RAISE NOTICE '==============================================';
    
    IF total_count = 0 THEN
        RAISE NOTICE '✅ 数据库清空成功！';
        RAISE NOTICE '';
        RAISE NOTICE '下一步：运行种子数据脚本';
        RAISE NOTICE '  psql -d doc_management -f 02-database-seed-complete.sql';
        RAISE NOTICE '或在 pgAdmin 中打开并执行 02-database-seed-complete.sql';
    ELSE
        RAISE WARNING '⚠️ 还有 % 行数据未清空，请检查！', total_count;
    END IF;
    
    RAISE NOTICE '==============================================';
END $$;

-- =====================================================
-- 查看序列状态
-- =====================================================

DO $$
DECLARE
    seq_record RECORD;
BEGIN
    RAISE NOTICE '';
    RAISE NOTICE '序列重置状态：';
    RAISE NOTICE '----------------------------------------------';
    
    FOR seq_record IN 
        SELECT sequence_name, last_value
        FROM information_schema.sequences
        WHERE sequence_schema = 'public'
        ORDER BY sequence_name
    LOOP
        RAISE NOTICE '%: %', 
            RPAD(seq_record.sequence_name, 30), 
            seq_record.last_value;
    END LOOP;
    
    RAISE NOTICE '----------------------------------------------';
END $$;

COMMIT;

-- =====================================================
-- 完成
-- =====================================================

DO $$
BEGIN
    RAISE NOTICE '';
    RAISE NOTICE '==============================================';
    RAISE NOTICE '🎉 清空脚本执行完成！';
    RAISE NOTICE '==============================================';
END $$;

